A 猜年龄
美国数学家维纳(N.Wiener)智力早熟,11岁就上了大学。他曾在1935~1936年应邀来中国清华大学讲学。
一次,他参加某个重要会议,年轻的脸孔引人注目。于是有人询问他的年龄,他回答说:
“我年龄的立方是个4位数。我年龄的4次方是个6位数。这10个数字正好包含了从0到9这10个数字,每个都恰好出现1次。”
请你推算一下,他当时到底有多年轻。
参考代码(暴力解题)
1 | #include<stdio.h> |
该题逼近到18-21可以直接输出 立方四次方 肉眼观察即可
B 马虎的算式
小明是个急性子,上小学的时候经常把老师写在黑板上的题目抄错了。
有一次,老师出的题目是:36 x 495 = ?
他却给抄成了:396 x 45 = ?
但结果却很戏剧性,他的答案竟然是对的!!
因为 36 * 495 = 396 * 45 = 17820
类似这样的巧合情况可能还有很多,比如:27 * 594 = 297 * 54
假设 a b c d e 代表1~9不同的5个数字(注意是各不相同的数字,且不含0)
能满足形如: ab * cde = adb * ce 这样的算式一共有多少种呢?
思路;将五位分别进行枚举 再组合成数 再求解
参考代码(暴力解题)
1 | #include<stdio.h> |
C 振兴中华
小明参加了学校的趣味运动会,其中的一个项目是:跳格子。
地上画着一些格子,每个格子里写一个字,如下所示:(也可参见p1.jpg)
一次,他参加某个重要会议,年轻的脸孔引人注目。于是有人询问他的年龄,他回答说:
从我做起振
我做起振兴
做起振兴中
起振兴中华
比赛时,先站在左上角的写着“从”字的格子里,可以横向或纵向跳到相邻的格子里,但不能跳到对角的格子或其它位置。一直要跳到“华”字结束。
要求跳过的路线刚好构成“从我做起振兴中华”这句话。
请你帮助小明算一算他一共有多少种可能的跳跃路线呢?
参考代码(暴力解题)
思路:第一行和第一列只有一种走法 都置为1,其他格子的走法都等于他的上一行同列元素与该行前一列元素的和。最终的结果就是最后一行最后一列的元素值.
1 | #include <stdio.h> |
D 幻方填空
幻方是把一些数字填写在方阵中,使得行、列、两条对角线的数字之和都相等。
欧洲最著名的幻方是德国数学家、画家迪勒创作的版画《忧郁》中给出的一个4阶幻方。
他把1,2,3,…16 这16个数字填写在4 x 4的方格中。
1 | 16 ? ? 13 |
表中有些数字已经显露出来,还有些用?和*代替。
请你计算出? 和 * 所代表的数字。并把 * 所代表的数字作为本题答案提交。
请你帮助小明算一算他一共有多少种可能的跳跃路线呢?
参考代码(暴力解题)
思路:利用stl全排列函数
1 | #include <bits/stdc++.h> |
E 公约数公倍数
我们经常会用到求两个整数的最大公约数和最小公倍数的功能。
下面的程序给出了一种算法。
函数 myfunc 接受两个正整数a,b
经过运算后打印出 它们的最大公约数和最小公倍数。
此时,调用 myfunc(15,20)
将会输出:
1 | 5 |
1 | void swap(int *a,int *b) |
1 | 答案:m/b*n或者m*n/b |
完整代码实现:
1 | #include <stdio.h> |
F 三部排序
一般的排序有许多经典算法,如快速排序、希尔排序等。
但实际应用时,经常会或多或少有一些特殊的要求。我们没必要套用那些经典算法,可以根据实际情况建立更好的解法。
比如,对一个整型数组中的数字进行分类排序:
使得负数都靠左端,正数都靠右端,0在中部。注意问题的特点是:负数区域和正数区域内并不要求有序。可以利用这个特点通过1次线性扫描就结束战斗!!
以下的程序实现了该目标。
其中x指向待排序的整型数组,len是数组的长度。
1 | void sort3p(int* x, int len) |
如果给定数组:
1 | 25,18,-2,0,16,-5,33,21,0,19,-16,25,-3,0 |
则排序后为:
1 | -3,-2,-16,-5,0,0,0,21,19,33,25,16,18,25 |
1 | 答案:p++ |
完整代码实现:
1 | #include <stdio.h> |
G 核桃的数量
小张是软件项目经理,他带领3个开发组。工期紧,今天都在加班呢。为鼓舞士气,小张打算给每个组发一袋核桃(据传言能补脑)。他的要求是:
1. 各组的核桃数量必须相同
2. 各组内必须能平分核桃(当然是不能打碎的)
3. 尽量提供满足1,2条件的最小数量(节约闹革命嘛)
输入:
1 | a b c |
输出:
1 | 一个正整数,表示每袋核桃的数量。 |
样例输入:
1 | 2 4 5 |
样例输出:
1 | 20 |
样例输入:
1 | 3 1 1 |
样例输出:
1 | 3 |
思路:先求出两个大数的最小公倍数 再求出三个数的最小公倍数
我的代码:
1 | #include <bits/stdc++.h> |
参考代码如下:(暴力解法)
1 | #include <stdio.h> |
I 带分数
100 可以表示为带分数的形式:100 = 3 + 69258 / 714
注意特征:带分数中,数字1~9分别出现且只出现一次(不包含0)。
类似这样的带分数,100 有 11 种表示法。
输入:
1 | 从标准输入读入一个正整数N (N<1000*1000) |
输出:
1 | 程序输出该数字用数码1~9不重复不遗漏地组成带分数表示的全部种数。 |
样例输入:
1 | 100 |
样例输出:
1 | 11 |
样例输入:
1 | 105 |
样例输出:
1 | 6 |
思路:用全排列求解
参考代码:
1 | #include <bits/stdc++.h> |